/*
 * linux.java
 *
 * Created on 23 de marzo de 2007, 06:51 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.Minisoft;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
/**
 *
 * @author Administrador
 */
public class linux implements Tactica{
    
    private int nValores[][]={
        {-145,0,6},  // Jugador 1[0]
        {-98,-51,6},  // Jugador 2[1]
        {-77,-5,6},  // Jugador 3[2]
        {-90,41,6},  // Jugador 4[3]
        {-14,53,5},  // Jugador 5[4]
        {-42,-5,6},  // Jugador 6[5]
        {-15,-51,6},  // Jugador 7[6]
        {57,7,6},  // Jugador 8[7] cccccc
        {81,60,6},  // Jugador 9[8]
        {96,-53,6},  // Jugador 10[9]
        {130,-26,6}  // Jugador 11[10]
    };
    
    public Color getColor1() {
        return Color.GREEN;
    }

    public Color getColor2() {
        return Color.WHITE;
    }

    public Color getColorNumero() {
        return Color.BLACK;
    }

    public String getNombre() {
        return "El Buen Linux";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        //Mejorar defensa
        if (!sj.estoyMasCercaDeBola() || bola.getX()<0){
            for (int n=2;n<4;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }
        }

        //Mejorar media
        if (!sj.estoyMasCercaDeBola() || bola.getX()<45){
            for (int n=4;n<8;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }
        }        
        
        //Movimiento portero
        int y=(int)(bola.getY()/2);
        if (y<-20) y=-20;
        if (y>20) y=20;
        com.add(new ComandoIrA(0,nValores[0][0], y));
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));

        lanzarBolaMejor(sj, com);
        
        return com;
    }
    
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-160;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<=10;n++){
            if (jugadores[n].getX()>45)
                com.add(new ComandoTiroAPuerta(n,15));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
    
}